home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1995 #1 / Amiga Plus 1995 #1.iso / fish-disketten / fish_941-950 / d946 / fd2pragma / fd2pragma.c < prev    next >
C/C++ Source or Header  |  1994-12-13  |  6KB  |  242 lines

  1. /*
  2.     fd2pragma.h
  3.  
  4.     This is a small little hack which converts fd-files to pragmas readable
  5.     by the Aztec-C-Compiler or include files readable by the Aztec-Assembler.
  6.     Use it as you want.
  7.  
  8.     Computer: Amiga 1200            Compiler: Aztec-C V5.0a
  9.                               Dice 2.07.54 (3.0)
  10.  
  11.     Author:    Jochen Wiedmann
  12.         Am Eisteich 9
  13.       72555 Metzingen (Germany)
  14.         Tel. 07123 / 14881
  15.         Internet: wiedmann@mailserv.zdv.uni-tuebingen.de
  16. */
  17.  
  18. #define FALSE (0)
  19. #define TRUE (!FALSE)
  20.  
  21. #include <stdio.h>
  22. #include <string.h>
  23. #include <stdlib.h>
  24. #include <ctype.h>
  25.  
  26.  
  27.  
  28.  
  29. void Usage(void)
  30.  
  31. { fprintf(stderr,
  32.       "Usage: fd2pragma fdfile/a,pragmafile/a,assembler/s\n\n");
  33.   fprintf(stderr, "The program reads the given fd-file and converts ");
  34.   fprintf(stderr, "into pragmas that\n");
  35.   fprintf(stderr, "can be read by the Aztec-Compiler.\n");
  36.   exit (1);
  37. }
  38.  
  39.  
  40.  
  41.  
  42. void main (int argc, char **argv)
  43.  
  44.   { FILE *fd, *pragm;
  45.     char *ptr, *ptr2;
  46.     char *defptr;
  47.     char *fdfile = NULL, *pragmafile = NULL;
  48.     int assembler = FALSE;
  49.     int bias = 0;
  50.     int linenum = 0;
  51.     int numargs;
  52.     int public = TRUE;
  53.     int i, deflen;
  54.     char line[512];
  55.     char baseptr[512];
  56.  
  57.     /*    No WBStartup    */
  58.     if (argc == 0)
  59.       { exit(0);
  60.       }
  61.  
  62.     for (i = 1;  i < argc;  i++)
  63.     { if(stricmp(argv[i], "assembler") == 0)
  64.       { assembler = TRUE;
  65.       }
  66.       else if (fdfile == NULL)
  67.       { fdfile = argv[i];
  68.       }
  69.       else if (pragmafile == NULL)
  70.       { pragmafile = argv[i];
  71.       }
  72.       else
  73.       { Usage();
  74.       }
  75.     }
  76.  
  77.     if (!fdfile  ||  !pragmafile)
  78.     { Usage();
  79.     }
  80.  
  81.     if ((fd = fopen (fdfile, "r"))  ==  NULL)
  82.       { fprintf(stderr, "Cannot open %s as input!\n", fdfile);
  83.       }
  84.     if ((pragm = fopen(pragmafile, "w"))  ==  NULL)
  85.       { fprintf(stderr, "Cannot open %s as output!\n", pragmafile);
  86.       }
  87.     defptr = fdfile;
  88.     if (index(defptr, ':')  !=  NULL)
  89.       { defptr = index(defptr, ':') + 1;
  90.       }
  91.     if (rindex(defptr, '/')  !=  NULL)
  92.       { defptr = rindex(defptr, '/') + 1;
  93.       }
  94.     if (!assembler  &&
  95.     (deflen = strlen(defptr)-7) >= 0  &&
  96.     strnicmp(defptr+deflen, "_lib.fd", 7) == 0)
  97.       { fprintf(pragm, "#ifndef PRAGMAS_");
  98.     for (i = 0;  i < deflen;  i++)
  99.       { putc(toupper((int) defptr[i]), pragm);
  100.       }
  101.     fprintf(pragm, "_LIB_H\n#define PRAGMAS_");
  102.     for (i = 0;  i < deflen;  i++)
  103.       { putc(toupper((int) defptr[i]), pragm);
  104.       }
  105.     fprintf(pragm, "_LIB_H\n\n#ifndef CLIB_");
  106.     for (i = 0;  i < deflen;  i++)
  107.       { putc(toupper((int) defptr[i]), pragm);
  108.       }
  109.     fprintf(pragm, "_PROTOS_H\n#include <clib/");
  110.     for (i = 0;  i < deflen;  i++)
  111.       { putc(tolower((int) defptr[i]), pragm);
  112.       }
  113.     fprintf(pragm, "_protos.h>\n#endif\n\n");
  114.       }
  115.     else
  116.       { defptr = NULL;
  117.       }
  118.  
  119.  
  120.  
  121.     *baseptr = '\0';
  122.     while(fgets(line, sizeof(line), fd)  !=  NULL)
  123.       { ++linenum;
  124.  
  125.     if(strlen(line) > 0  &&  line[strlen(line)-1] != '\n')
  126.       { fprintf(stderr, "Error: line %d too long!\n", linenum);
  127.       }
  128.     line[strlen(line)-1] = '\0';    /*  Remove LF   */
  129.  
  130.     if(*line == '*')
  131.       { /*    Ignore any comments */
  132.       }
  133.     else if (strncmp(line, "##base", 6)  ==  0)
  134.       { if (*baseptr == '\0')
  135.           { if ((ptr = strchr(line, '_'))  ==  NULL)
  136.           { fprintf(stderr,
  137.                 "Line %d: Library-Basepointer in unexpected format!\n",
  138.                 linenum);
  139.           }
  140.         strcpy(baseptr, ++ptr);
  141.         if (!assembler)
  142.         { printf("Using Library-Basepointer %s.\n", baseptr);
  143.         }
  144.           }
  145.         else
  146.           { fprintf(stderr, "Line %d: Library-Baseptr already set!\n",
  147.             linenum);
  148.           }
  149.       }
  150.     else if (strncmp(line, "##bias", 6)  ==  0)
  151.       { if ((bias = atol(line+6)) <= 0  ||  bias % 6 != 0)
  152.           { fprintf (stderr, "Line %d: Bias has an uncorrect value!\n");
  153.           }
  154.       }
  155.     else if (strncmp(line, "##public", 8)  ==  0)
  156.       { public = TRUE;
  157.       }
  158.     else if (strncmp(line, "##private", 9)  ==  0)
  159.       { public = FALSE;
  160.       }
  161.     else if (strncmp(line, "##end", 5)  ==  0)
  162.       { if (defptr)
  163.           { fprintf(pragm,"\n#endif  /*  PRAGMAS_");
  164.         for (i = 0;  i < deflen;  i++)
  165.           { putc(toupper((int) defptr[i]), pragm);
  166.           }
  167.         fprintf(pragm, "_LIB_H  */\n");
  168.           }
  169.         fclose(fd);
  170.         fclose(pragm);
  171.         exit(0);
  172.       }
  173.     else if (*line == '#')
  174.       { fprintf(stderr, "Line %d: Unknown command!\n", linenum);
  175.       }
  176.     else
  177.       { if (public)
  178.           { if (!assembler  &&  *baseptr == '\0')
  179.           { fprintf(stderr, "Line %d: Library-Basepointer not set!\n",
  180.                 linenum);
  181.           }
  182.         if (bias == 0)
  183.           { fprintf(stderr, "Line %d: Bias not set!\n", linenum);
  184.           }
  185.         if ((ptr = strchr(line, '('))  ==  NULL)
  186.           { fprintf(stderr, "Line %d: Unknown function-format!\n",
  187.                 linenum);
  188.  
  189.           }
  190.         else
  191.           { *ptr = '\0';
  192.             if (assembler)
  193.             { fprintf(pragm, "\txdef\t_LVO%s\n_LVO%s\tequ\t%d\n",
  194.                   line, line, -bias);
  195.             }
  196.             else
  197.             { fprintf(pragm, "#pragma amicall(%s, 0x%x, %s(",
  198.                   baseptr, bias, line);
  199.               if ((ptr = strchr(ptr+1, '('))  ==  NULL)
  200.               { fprintf(stderr, "Line %d: Unknown format!\n",
  201.                 linenum);
  202.               }
  203.               else
  204.               { char c = '\0';
  205.  
  206.             ++ptr;
  207.             numargs = 0;
  208.             do
  209.             { if ((ptr2 = strchr(ptr, '/'))  !=  NULL  ||
  210.                   (ptr2 = strchr(ptr, ')'))  !=  NULL)
  211.               { c = *ptr2;
  212.                 if (ptr < ptr2)
  213.                 { *ptr2 = '\0';
  214.                   fprintf(pragm, "%s%s",
  215.                       (numargs == 0) ? "" : ",",
  216.                       ptr);
  217.                 }
  218.                 ptr = ptr2+1;
  219.                 numargs++;
  220.               }
  221.               else
  222.               { fprintf(stderr, "Line %d: Unknown format!\n",
  223.                     linenum);
  224.                 break;
  225.               }
  226.             }
  227.             while (c != ')');
  228.             fprintf(pragm, "))\n");
  229.               }
  230.             }
  231.           }
  232.           }
  233.         bias += 6;
  234.       }
  235.       }
  236.  
  237.     fprintf(stderr, "Missing ##end!\n");
  238.     fclose(fd);
  239.     fclose(pragm);
  240.     exit(0);
  241.   }
  242.